/*
    Autor: David Roberto Bellomo Gomez
    Nombre: App_ADC.cpp
    Descripción: Implementación de las funciones del ADC
    Modificaciones:
    Fecha:
    Nota:
*/
#include "PearlScopeV1.h"
/*
  Nombre: startADC
  Par�metros: Void
  Regresa:  Void
  Descrición: Funcion que corre el ADC
  Modificaciónes:
  Fecha:
  Nota:
*/
void startADC( void )
{
	// Enable ADC
	sbi(ADCSRA,ADEN);
	// Start conversion
	sbi(ADCSRA,ADSC);
}
/*
  Nombre: stopADC
  Par�metros: Void
  Regresa:  Void
  Descrición: Funcion que detiene el ADC
  Modificaciónes:
  Fecha:
  Nota:
*/

void stopADC( void )
{
	// Disable ADC and stop Free Running Conversion Mode
	cbi(ADCSRA,ADEN);
}


/*
  Nombre:setADCPrescaler
  Par�metros: T_UWORD Prescaler / Valor de prescaler
  Regresa:  Void
  Descrición: Funcion que setea el valor del nuevo prescaler
  Modificaciónes:
  Fecha:
  Nota:
*/
void setADCPrescaler( T_UWORD Prescaler )
{
	// These bits determine the division factor between the system clock
	// frequency and the input clock to the ADC.
	//	ADPS2	ADPS1	ADPS0	Division Factor
	//	0	0	0	2
	//	0	0	1	2
	//	0	1	0	4
	//	0	1	1	8
	//	1	0	0	16
	//	1	0	1	32
	//	1	1	0	64
	//	1	1	1	128
	switch (Prescaler)
	{
	case 2:
		cbi(ADCSRA,ADPS2);
		cbi(ADCSRA,ADPS1);
		sbi(ADCSRA,ADPS0);
		break;
	case 4:
		cbi(ADCSRA,ADPS2);
		sbi(ADCSRA,ADPS1);
		cbi(ADCSRA,ADPS0);
		break;
	case 8:
		cbi(ADCSRA,ADPS2);
		sbi(ADCSRA,ADPS1);
		sbi(ADCSRA,ADPS0);
		break;
	case 16:
		sbi(ADCSRA,ADPS2);
		cbi(ADCSRA,ADPS1);
		cbi(ADCSRA,ADPS0);
		break;
	case 32:
		sbi(ADCSRA,ADPS2);
		cbi(ADCSRA,ADPS1);
		sbi(ADCSRA,ADPS0);
		break;
	case 64:
		sbi(ADCSRA,ADPS2);
		sbi(ADCSRA,ADPS1);
		cbi(ADCSRA,ADPS0);
		break;
	case 128:
		sbi(ADCSRA,ADPS2);
		sbi(ADCSRA,ADPS1);
		sbi(ADCSRA,ADPS0);
		break;
	default:	// Set 128
		sbi(ADCSRA,ADPS2);
		sbi(ADCSRA,ADPS1);
		sbi(ADCSRA,ADPS0);
	}
}



/*
  Nombre:setVoltageReference
  Par�metros: T_UWORD reference / eleccion de referencia
  Regresa:  Void
  Descrición:
  Modificaciónes:
  Fecha:
  Nota:
*/
void setVoltageReference( T_UWORD reference )
{
	// These bits select the voltage reference for the ADC. If these bits
	// are changed during a conversion, the change will not go in effect
	// until this conversion is complete (ADIF in ADCSRA is set). The
	// internal voltage reference options may not be used if an external
	// reference voltage is being applied to the AREF pin.
	//	REFS1	REFS0	Voltage reference
	//	0	0	AREF, Internal Vref turned off
	//	0	1	AVCC with external capacitor at AREF pin
	//	1	0	Reserved
	//	1	1	Internal 1.1V Voltage Reference with external
	//			capacitor at AREF pin
	switch (reference)
	{
	case 0:
		cbi(ADMUX,REFS1);
		cbi(ADMUX,REFS0);
		break;
	case 2:
		sbi(ADMUX,REFS1);
		sbi(ADMUX,REFS0);
		break;
	case 1:
	default:
		cbi(ADMUX,REFS1);
		sbi(ADMUX,REFS0);
	}
}
